<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 1问  变量未声明，就使用，就是 undefined
        // console.log(num);

        // 2问
        // console.log(age); // undefined
        // var age = 10;
        // 变量预解析：把变量的声明提升到当前作用域的最前面，但是不提升赋值。
        // console.log('-------相当于执行了下面的代码---');
        // var age;
        // console.log(age);
        // age = 10;

        // 3问  函数可以先执行，再调用。
        // fn();
        // function fn() {
        //     console.log(11);
        // }
        // 函数预解析：把函数的声明提升到当前作用域的最前面，但是不调用函数。
        // console.log('-------相当于执行了下面的代码---');
        // function fn() {
        //     console.log(11);
        // }
        // fn();

        // 4问
        var fun = function () {
            console.log(22);
        }
        fun();
        //    函数预解析：把函数的声明提升到当前作用域的最前面，但是不调用函数。
        console.log('-------相当于执行了下面的代码---');
        var fun;
        fun = function () {
            console.log(22);
        }
        fun();

        /*
            代码的解析，运行过程：
                先转化为二进制。二进制运行，结果再转化为当前值。
            js 代码是在浏览器中运行。通过浏览器的引擎进行解析，执行。
            也就是说在js内部有一个js引擎。
            js 引擎运行js代码分两步：预解析(代码会进行一次初加工)和代码执行(从上往下)
            预解析：
                1. js 引擎会进行变量提升(变量预解析)和函数提升(函数预解析)。
            变量预解析：把变量的声明提升到当前作用域的最前面，但是不提升赋值。var
            函数预解析：把函数的声明提升到当前作用域的最前面，但是不调用函数。function
        */
    </script> 
</body>
</html>